package com.kiven.thread;

import java.lang.Runnable;

public class ThreadDemo implements Runnable {

	/*
	 * 同步代码块和同步方法区别和用法
	 * 
	 */
	
	@Override
	public synchronized void run() {
		//System.out.println(this.getClass().getName());
		for(int i=0 ; i<10; i++) {
			System.out.print(" " + i);
		}
		//System.out.println("\r\n");
	}

	public static void main(String[] args) throws Exception {
		/*
		 * 线程同步方法： synchronized所对应的同步是指，一个
		 * 
		 * 这个程序中synchronized关键字保护的不是共享数据（
		 * 其实在这个程序中synchronized关键字没有起到任何作用，此程序的运行结果是不可预先确定的）。这个程序中的t1,
		 * t2是两个对象（r1, r2）的线程。JAVA是面向对象的程序设计语言，不同的对象的数据是不同的，r1, r2有各自的run()
		 * 方法，而synchronized使同一个对象的多个线程，
		 * 在某个时刻只有其中的一个线程可以访问这个对象的synchronized数据。每个对象都有一个 "锁标志"，
		 * 当这个对象的一个线程访问这个对象的某个synchronized数据时，这个对象的所有被synchronized修饰的数据将被上锁（因为
		 * "锁标志" 被当前线程拿走了），只有当前线程访问完它要访问的synchronized数据时，当前线程才会释放 "锁标志"，
		 * 这样同一个对象的其它线程才有机会访问synchronized数据。
		 */
		Runnable r1 = new ThreadDemo();
		Runnable r2 = new ThreadDemo();
		
		Thread t1 = new Thread(r1);
		Thread t2 = new Thread(r1);
		Thread t3 = new Thread(r1);
		
		t1.start();
		t2.start();
		t3.start();
	}

}
